# -*- coding:utf-8 -*-
# 给定一个 m x n 的矩阵，如果一个元素为 0，则将其所在行和列的所有元素都设为 0。请使用原地算法。

# 示例 1:
# 输入: 
# [
#   [1,1,1],
#   [1,0,1],
#   [1,1,1]
# ]
# 输出: 
# [
#   [1,0,1],
#   [0,0,0],
#   [1,0,1]
# ]

# 示例 2:
# 输入: 
# [
#   [0,1,2,0],
#   [3,4,5,2],
#   [1,3,1,5]
# ]
# 输出: 
# [
#   [0,0,0,0],
#   [0,4,5,0],
#   [0,3,1,0]
# ]
# 进阶:
# 一个直接的解决方案是使用  O(mn) 的额外空间，但这并不是一个好的解决方案。
# 一个简单的改进方案是使用 O(m + n) 的额外空间，但这仍然不是最好的解决方案。
# 你能想出一个常数空间的解决方案吗？

# # 借用了python的list可以不同类型混搭
# class Solution(object):
#     def setZeroes(self, matrix):
#         """
#         :type matrix: List[List[int]]
#         :rtype: None Do not return anything, modify matrix in-place instead.
#         """
#         row = len(matrix)
#         col = len(matrix[0])
#         for x in xrange(row):
#             for y in xrange(col):
#                 if matrix[x][y] == 0:
#                     for m in xrange(row):
#                         if matrix[m][y] != 0:
#                             matrix[m][y] = "x"
#                     for m in xrange(col):
#                         if matrix[x][m] != 0:
#                             matrix[x][m] = "x"
#         for x in xrange(row):
#             for y in xrange(col):
#                 if matrix[x][y] == "x":
#                     matrix[x][y] = 0
#         return matrix


# 查看官方的解题思路
# 把第一行、第一列当做是标记位
# 第一遍遍历生成标记位
# 第二遍进行置0
class Solution(object):
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: None Do not return anything, modify matrix in-place instead.
        """
        row = len(matrix)
        col = len(matrix[0])

        row0_tag = False
        for x in xrange(col):
            if matrix[0][x] == 0:
                row0_tag = True
        col0_tag = False
        for x in xrange(row):
            if matrix[x][0] == 0:
                col0_tag = True

        for x in xrange(1, row):
            for y in xrange(1, col):
                if matrix[x][y] == 0:
                    matrix[x][0] = 0
                    matrix[0][y] = 0

        for x in xrange(1, row):
            for y in xrange(1, col):
                if matrix[x][0] == 0 or matrix[0][y] == 0:
                    matrix[x][y] = 0

        if row0_tag:
            for x in xrange(col):
                matrix[0][x] = 0

        if col0_tag:
            for x in xrange(row):
                matrix[x][0] = 0

        return matrix

t = Solution()
# print(t.setZeroes([[1,1,1],[1,0,1],[1,1,1]]))
print(t.setZeroes([[0,1,2,0], [3,4,5,2], [1,3,1,5]] ))